package com.xjh.basestudy.leetcode.question;

/**
 * @Author:XuJianHua
 * @Date:2022/12/30
 * @Description:
 * 给定一个已排序的链表的头 head ， 删除所有重复的元素，使每个元素只出现一次 。返回 已排序的链表 。
 */
public class Q83_deleteDuplicates {
    public static void main(String[] args) {

        ListNode l2 = new ListNode(2);
        l2.next = new ListNode(4);
        l2.next.next = new ListNode(4);
        l2.next.next.next = new ListNode(5);
        l2.next.next.next.next = new ListNode(5);
        ListNode listNode = deleteDuplicates(l2);
        System.out.println(listNode);
        for (ListNode cur = l2; cur != null; cur = cur.next) {
            System.out.println(cur.val);
        }
    }
    /**
     * 标签：链表
     * 指定 cur 指针指向头部 head
     * 当 cur 和 cur.next 的存在为循环结束条件，当二者有一个不存在时说明链表没有去重复的必要了
     * 当 cur.val 和 cur.next.val 相等时说明需要去重，则将 cur 的下一个指针指向下一个的下一个，这样就能达到去重复的效果
     * 如果不相等则 cur 移动到下一个位置继续循环
     * 时间复杂度：O(n)
     * */
    public static ListNode deleteDuplicates(ListNode head) {
        // 指定 cur 指针指向头部 head
        ListNode cur = head;
        // 当 cur 和 cur.next 的存在为循环结束条件，当二者有一个不存在时说明链表没有去重复的必要了
        while(cur != null && cur.next != null) {
            // 当 cur.val 和 cur.next.val 相等时说明需要去重，则将 cur 的下一个指针指向下一个的下一个，这样就能达到去重复的效果
            if(cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                // 如果不相等则 cur 移动到下一个位置继续循环
                cur = cur.next;
            }
        }
        return head;
    }
}

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */


